package ltd.starriddle.smart4j.framework.helper;

import ltd.starriddle.smart4j.framework.annotation.Action;
import ltd.starriddle.smart4j.framework.bean.Handler;
import ltd.starriddle.smart4j.framework.bean.Request;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 控制器助手类
 *
 * @author CYL
 * @since 2020-12-25
 */
public class ControllerHelper {

    /**
     * 用于存放请求与 Action 信息的映射关系
     */
    private static final Map<Request, Handler> ACTION_MAP = new HashMap<>();

    static {
        Set<Class<?>> controllerClassSet = ClassHelper.getControllerClassSet();
        if (CollectionUtils.isNotEmpty(controllerClassSet)) {
            // 如存在 Controller 类，则遍历所有 Controller 类
            for (Class<?> controllerClass : controllerClassSet) {
                Method[] methods = controllerClass.getDeclaredMethods();
                if (ArrayUtils.isNotEmpty(methods)) {
                    // 如 Controller 类存在方法，则遍历所有方法
                    for (Method method : methods) {
                        if (method.isAnnotationPresent(Action.class)) {
                            // 如 方法带有 Action 注解，则添加映射，下一步：验证 URL 请求信息
                            String mapping = method.getAnnotation(Action.class).value();
                            if (mapping.matches("\\w+:/\\w*")) {
                                // 如 URL 请求规则符合规则（方法:路径），则添加映射，下一步：处理 URL 请求信息
                                String[] array = mapping.split(":");
                                if (array.length == 2) {
                                    Request request = new Request(array[0], array[1]);
                                    Handler handler = new Handler(controllerClass, method);
                                    // 添加请求和处理的映射
                                    ACTION_MAP.put(request, handler);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * 根据请求信息 获取 Handler
     * @param requestMethod
     * @param requestPath
     * @return
     */
    public static Handler getHandler(String requestMethod, String requestPath) {
        Request request = new Request(requestMethod, requestPath);
        return ACTION_MAP.get(request);
    }
}
